package com.hh.converter;

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ReadConverterContext;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.WriteCellData;

import java.util.Objects;

/**
 * com.hh.converter
 *
 * @author hanhui
 * @version 1.0
 * @description Long类型与Excel字符串类型之间的转换器
 * //t 实现了Converter接口，用于处理Excel中字符串格式的用户编号与Java中Long类型的相互转换
 * //r 支持从Excel读取字符串并转换为Long类型
 * //r 支持将Long类型转换为字符串写入Excel
 * @since 2025/8/21 16:59
 **/
public class UserGenderConverter implements Converter<Integer> {
    /**
     * 支持的java类型
     *
     * @return 返回Long.class，表示此转换器支持Java中的Long类型
     * //t 指定转换器处理的Java数据类型
     * //r 用于标识转换器能够处理的Java对象类型
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    /**
     * 支持的excel值类型
     *
     * @return 返回CellDataTypeEnum.STRING，表示此转换器处理Excel中的字符串类型
     * //t 指定转换器处理的Excel单元格数据类型
     * //r 用于标识转换器能够处理的Excel单元格数据类型
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 这里读的时候会调用
     *
     * @param context Excel读取转换的上下文信息，包含单元格数据等
     * @return 将Excel中的字符串值转换为Long类型并返回
     * //t 实现从Excel到Java的数据转换逻辑
     * //r 在读取Excel数据时被调用，负责将Excel单元格内容转换为Java对象
     */
    @Override
    public Integer convertToJavaData(ReadConverterContext<?> context) {
        String value = context.getReadCellData().getStringValue();
        if (Objects.equals(value, "男")) {
            return 0;
        } else if (Objects.equals(value, "女")) {
            return 1;
        }
        return null;
    }

    /**
     * 这里是写的时候会调用 不用管
     *
     * @param context Long类型数据的写入转换上下文
     * @return 将Long类型转换为字符串格式的WriteCellData对象
     * //t 实现从Java到Excel的数据转换逻辑
     * //r 在写入Excel数据时被调用，负责将Java对象转换为Excel单元格内容
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<Integer> context) {
        if (Objects.equals(context.getValue(), 0)) {
            return new WriteCellData<>("男");
        } else if (Objects.equals(context.getValue(), 1)) {
            return new WriteCellData<>("女");
        }
        return new WriteCellData<>(String.valueOf(context.getValue()));
    }
}
